home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
kowin
/
util
/
timer11s.lzh
/
timer.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-08-27
|
17KB
|
654 lines
/*/ ******************************************************************* /*/
/*/ /*/
/*/ TIMER.win version 1.00 1990 10/23 by 小笠原博之 /*/
/*/ SPS0783 COR. /*/
/*/ /*/
/*/ v1.10 : 1991 8/5 /*/
/*/ v1.11 : 1991 8/27 /*/
/*/ /*/
/*/ ******************************************************************* /*/
#include <stdio.h>
#include <wlib.h>
#include <parts.h>
#include "wide.inc"
/*#define DEBUG/**/
#define in(x1,y1,x2,y2) (info->x>=(x1)&&info->y>=(y1)&&info->x<(x2)&&info->y<(y2))
/*/
/* イベント定義
/*/
#define EVENT (EventOpenON \
|EventRedrawON \
|EventCloseON \
|EventIntervalON \
|EventUserON \
|EventKeyON \
|EventIconifyON \
|EventMouseEnterON \
|EventMouseOutON \
|EventMouseSwitchON)
#define WINSIZEX 108 /* 小さい時のウィンドウサイズ */
#define WINSIZEY 24
#define WINSIZE2X 108 /* 大きい時のウィンドウサイズ */
#define WINSIZE2Y 98
#define WIDEONX (80*6+8)
#define WIDEONY (WINSIZE2Y)
#define WIDEOFFX (WINSIZE2X)
#define WIDEOFFY (WINSIZE2Y)
#define CLX 3 /* Close BOX の位置 */
#define CLY 4
#define ICX 3 /* Icon BOX の位置 */
#define ICY 13
#define OFFX 20 /* 時刻の表示位置 */
#define OFFY 4
#define ALMX 88 /* アラームマークの表示位置 */
#define ALMY 4
#define TMMX 96 /* タイマーマークの表示位置 */
#define TMMY 4
#define SGMX 88 /* 時報マークの表示位置 */
#define SGMY 12
#define WIDEX 98 /* 時報マークの表示位置 */
#define WIDEY 57
#define MDX 98 /* フォント切り替えスイッチの表示位置 */
#define MDY 13
#define SGSTRX 4 /* シグナルスイッチ */
#define SGSTRY 28
#define ALSTRX 4 /* アラームスイッチ */
#define ALSTRY 42
#define TMSTRX 4 /* タイマースイッチ */
#define TMSTRY 56
#define STLINXX 4 /* ステータスライン */
#define STLINYY 70
#define STLINX 4 /* インプットライン */
#define STLINY 84
#define mPCM 0
#define mEXEC 1
#define mBEEP 2
/*//////////////////////////////////////////////////////////////////////*/
/* グローバル宣言 */
/*//////////////////////////////////////////////////////////////////////*/
/*** function ***/
extern void date_get();
extern int date_get2();
extern void date_get();
extern int time_get2();
int EventExec();
extern int alarmflag;
extern int timerflag;
extern int signalflag;
extern int alarmtime;
extern int timertime;
extern int alarmevent;
extern int alm;
extern int sigmode;
extern Sheet Alarm_markPattern;
extern Sheet Timer_markPattern;
extern Sheet Sig_markPattern;
extern Sheet Close2Pattern;
extern Sheet Icon2Pattern;
extern Sheet ModePattern;
extern Sheet Pattern[];
/*** heap size ***/
int WindowHeapSize= 0;
Sheet *pat= Pattern;
unsigned char bstr[20];
int f= 0/*4*/;
int iconmode= TRUE;
int widemode= FALSE;
int mode= mPCM;
int pcmsize;
unsigned char *pcmdata;
unsigned char pcmfile[70];
unsigned char pcmname[24];
unsigned char exeline[256];
unsigned char alarmstr[10]={ '0','0',':','0','0',':','0','0',0 };
unsigned char timerstr[10]={ '0','0',':','0','0',':','0','0',0 };
unsigned char *modestr[3]={
(unsigned char*)"PCM ",
(unsigned char*)"Exec",
(unsigned char*)"Beep"
};
unsigned char pcminput[80];
unsigned char exeinput[80];
InputClass pcmin;
InputClass exein;
int datemode= 8;
/*
0 16:43:43
1 1991/08/05
2 1991-08-05
3 91/08/05
4 91-08-05 16:43:43
5 1991/08/05 16:43:43
6 1991-08-05 16:43:43
7 91/08/05 16:43:43
8 91-08-05 16:43:43
*/
/*//////////////////////////////////////////////////////////////////////*/
/* メインルーチン */
/*//////////////////////////////////////////////////////////////////////*/
void
WindowMain( argc, argv )
int argc;
unsigned char **argv;
{
WindowID wp;
int x= 2,
y= 2;
/*/
/* オプション解析
/*/
signalflag= TRUE;
alarmflag= FALSE;
timerflag= FALSE;
alarmevent= TRUE;
alm= FALSE;
*pcmfile= '\0';
*pcmname= '\0';
*exeline= '\0';
pcmdata= 0;
sigmode= FALSE;
argc= AnalyzeArgs( argc, argv, &x, &y, 0, 0 );
while( --argc ){
if( **++argv == '-' ){
switch( *++*argv ){
case 'f': /* font */
f= atoi2( *argv+1 );
break;
case 's': /* signal off */
signalflag= FALSE;
break;
case 'b': /* signal mode */
sigmode= TRUE;
break;
case 'm': /* exec mode */
mode= atoi2( *argv+1 );
break;
case 'e': /* exec file */
strcpy( exeline, *argv+1 );
break;
case 'd': /* send format */
datemode= atoi2( *argv+1 );
break;
case 'a': /* alarm time */ /* 隠しスイッチ扱い */
strncpy( alarmstr, *argv+1, 8 );
alarmtime=TIMEBCD( TIMECNV( alarmstr ) );
alarmflag= TRUE;
}
}else
strcpy( pcmfile, *argv );
}
if( f == 9 ) /* 隠しフォント */
pat= &Pattern[5*11];
else
pat= &Pattern[f*11];
/*/
/* ウィンドウ設定
/*/
wp = WindowSimpleOpen( x, y, WINSIZEX, WINSIZEY, NULL, EventExec );
WindowSetEventAttr( wp, EVENT );
}
/*
/ 00:00:00 ♪ゥ
signal mode PCM
alarm 00:00:00
timer 00:00:00
beep.pcm
*/
/*//////////////////////////////////////////////////////////////////////*/
/* イベント処理ルーチン */
/*//////////////////////////////////////////////////////////////////////*/
EventExec( wp, info )
WindowID wp;
EventInfo *info;
{
int x;
unsigned char str[20];
DrawBuf buf[50];
switch( info->option ){
case EventOpen:
if( *pcmfile ){
pcmload();
mode= mPCM;
}
InputSet( &pcmin, STLINX, STLINY, (char*)pcminput, 80, 9, 12 );
InputSet( &exein, STLINX, STLINY, (char*)exeinput, 80, 9, 12 );
*pcminput= '\0';
*exeinput= '\0';
WindowRedraw( wp );
return TRUE;
case EventRedraw: {
DrawBuf *bp= buf;
DrawSetClear( bp++, 1 );
DrawSetPut( bp++, CLX, CLY, &Close2Pattern );
DrawSetPut( bp++, ICX, ICY, &Icon2Pattern );
DrawSetLine( bp++, OFFX-4, OFFY-1, OFFX+8*8+2, OFFY+16, ShadowDown, OptionShadow );
time_get( str );
if( f<5 || f == 9 ){
int i;
unsigned char *ptr= str;
unsigned char *ptr2=bstr;
for( i=0 ; i<8 ; i++ )
DrawSetPut( bp++, i*8+OFFX, OFFY,&pat[(*ptr2++=*ptr++) -'0'] );
}else
DrawSetSymbol( bp++, OFFX, OFFY, (char*)str, 9, 16 );
bp+= markset( bp, 0 );
DrawSetPut( bp++, MDX, MDY, &ModePattern );
DrawSetLine( bp++, 1, 25, WINSIZE2X-1, 26, ShadowDown, OptionShadow );
DrawSetSymbol( bp++, SGSTRX, SGSTRY, "signal mode", 9, 12 );
DrawSetSymbol( bp++, SGSTRX+72, SGSTRY, (char*)modestr[mode], 9|4, 12 );
DrawSetLine( bp++, SGSTRX-2, SGSTRY, SGSTRX+36, SGSTRY+12, ShadowUp, OptionShadow );
DrawSetLine( bp++, SGSTRX+40, SGSTRY, SGSTRX+66, SGSTRY+12, ShadowUp, OptionShadow );
DrawSetSymbol( bp++, ALSTRX+3, ALSTRY, "alarm", 9, 12 );
DrawSetSymbol( bp++, ALSTRX+44, ALSTRY, (char*)alarmstr, 9, 12 );
DrawSetLine( bp++, ALSTRX-2, ALSTRY, ALSTRX+36, ALSTRY+12, ShadowUp, OptionShadow );
DrawSetSymbol( bp++, TMSTRX+3, TMSTRY, "timer", 9, 12 );
DrawSetSymbol( bp++, TMSTRX+44, TMSTRY, timerflag ? "running" : (char*)timerstr, 9, 12 );
DrawSetLine( bp++, TMSTRX-2, TMSTRY, TMSTRX+36, TMSTRY+12, ShadowUp, OptionShadow );
DrawSetLine( bp++, ALSTRX+43, ALSTRY+13, WINSIZE2X-12, ALSTRY+13, 0, OptionLine );
DrawSetPut( bp++, WIDEX, WIDEY, &WidePattern );
DrawSetSymbol( bp++, WINSIZE2X+20, 32,
"Timer.win Version 1.11 1991 by COR.", 9|4, 16 );
bp+= stline( bp );
WindowDraw( wp, buf, bp-buf );
return TRUE;
}
case EventClose:
if( pcmdata )
MFREE( pcmdata );
WindowClose( wp );
WindowConnectionClose();
return TRUE;
case EventInterval: {
int a;
extern unsigned char pii[],
poon[];
if( a=time_get2( str ) ){
if( f < 5 || f == 9 ){
int i= 0,
x= OFFX;
unsigned char *ptr= str;
unsigned char *ptr2=bstr;
DrawBuf *bptr=buf;
for(; *ptr ; ptr++, ptr2++, x+=8 ){
if( *ptr2 != *ptr ){
DrawSetPut( bptr++, x, OFFY, &pat[(*ptr2= *ptr) -'0'] );
i++;
}
}
WindowDraw( wp, buf, i );
}else{
DrawSetSymbol( buf, OFFX, OFFY, (char*)str, 9, 16 );
WindowDraw( wp, buf, 1 );
}
if( a>1 )
switch( a ){
case 2: /* pii! */
ADPCMOUT( pii, 4*256+3, 2000 );
break;
case 4: /* poon! */
ADPCMOUT( poon, 4*256+3, 7000 );
break;
case 5: /* bon bon */
ADPCMMOD( 0 );
ADPCMOUT( poon, 1*256+3, 7000 );
break;
case 3: /* alarm */
switch( mode ){
case mPCM:
if( pcmdata ){
ADPCMOUT( pcmdata, 4*256+3, pcmsize );
#ifdef DEBUG
puts("deden");
#endif
}
break;
case mEXEC:
progexec();
break;
case mBEEP:
B_PUTC(7);
}
if( alm )
WindowRedraw( wp );
}
return TRUE;
}
return FALSE;
}
case EventMouseEnter:
case EventMouseOut:
if( mode != mBEEP )
WindowDraw( wp, buf, InputSetCursorVisible( buf, mode == mPCM ? &pcmin : &exein, info->option == EventMouseEnter ) );
return TRUE;
case EventIconify:
goto iconbox;
case EventMouseSwitch:
if( info->LeftON ){
if( in( CLX, CLY, CLX+8, CLY+8 ) ){
/*/ close box /*/
if( pcmdata ){
MFREE( pcmdata );
pcmdata = 0;
}
WindowSendSignal( WindowProcessID, SignalKill, 0 );
return TRUE;
}else if( in( ICX, ICY, ICX+8, ICY+8 ) ){
/*/ icon box /*/
int x,y;
iconbox:
WindowGetPosition( wp, &x, &y );
if( iconmode = !iconmode )
WindowResize( wp, x, y, WINSIZEX, WINSIZEY );
else
WindowResize( wp, x, y, WINSIZE2X, WINSIZE2Y );
widemode= FALSE;
return TRUE;
}else if( in( MDX, MDY, MDX+8, MDY+6 ) ){
/*/ font change box /*/
if( ++f > 5 )
f= 0;
pat= &Pattern[f*11];
WindowRedraw( wp );
return TRUE;
}else if( in( SGSTRX-2, SGSTRY, SGSTRX+36, SGSTRY+12 ) ){
/*/ signal /*/
signalflag = !signalflag;
WindowDraw( wp, buf, markset( buf, 1 ) );
return TRUE;
}else if( in( SGSTRX+40, SGSTRY, SGSTRX+66, SGSTRY+12 ) ){
/*/ mode /*/
if( ++mode > mBEEP )
mode= mPCM;
DrawSetSymbol( buf, SGSTRX+72, SGSTRY, (char*)modestr[mode], 9|4, 12 );
WindowDraw( wp, buf, 1+stline(buf+1) );
return TRUE;
}else if( in( ALSTRX-2, ALSTRY, ALSTRX+36, ALSTRY+12 ) ){
/*/ alarm /*/
alarmflag = !alarmflag;
WindowDraw( wp, buf, markset( buf, 1 ) );
return TRUE;
}else if( in( TMSTRX-2, TMSTRY, TMSTRX+36, TMSTRY+12 ) ){
/*/ timer /*/
timerflag = !timerflag;
if( timerflag ){
int time= TIMECNV( timerstr );
int time2= TIMEBIN(TIMEGET());
int h2,m2,s2;
s2= time & 0xff;
m2= (time>>8) & 0xff;
h2= (time>>16) & 0xff;
s2= (time2 & 0xff) + s2;
if( s2>=60 ){
s2-=60;
m2++;
}
m2= ((time2>>8) & 0xff) + m2;
if( m2>=60 ){
m2-=60;
h2++;
}
h2= ((time2>>16) & 0xff) + h2;
timertime= TIMEBCD( (h2<<16)+(m2<<8)+s2 );
#ifdef DEBUG
{unsigned char buf[80];
TIMEASC( (h2<<16)+(m2<<8)+s2, buf );
puts( buf );
}
#endif
}
DrawSetSymbol( buf, TMSTRX+44, TMSTRY, timerflag ? "running " : (char*)timerstr, 9, 12 );
WindowDraw( wp, buf, 1+markset( buf+1, 1 ) );
return TRUE;
}else if( in( OFFX-4, OFFY-1, OFFX+8*8+2, OFFY+16 ) ){
unsigned char datebuf[40],
timebuf[20];
if( datemode )
date_get( datebuf, (datemode-1)& 3 );
time_get( timebuf );
if( datemode >= 5 ){
strcat( datebuf, " " );
strcat( datebuf, timebuf );
}
SendData( wp, info, UserString, datebuf );
return TRUE;
}else if( in( WIDEX, WIDEY, WIDEX+8, WIDEY+10 ) ){
int x,y;
WindowGetPosition( wp, &x, &y );
if( widemode = !widemode )
WindowResize( wp, x, y, WIDEONX, WIDEONY );
else
WindowResize( wp, x, y, WIDEOFFX, WIDEOFFY );
return TRUE;
}
}
if( in( ALSTRX+44, ALSTRY, ALSTRX+44+48, ALSTRY+12 ) ){
timechange( ALSTRX+44, ALSTRY, alarmstr, info );
DrawSetSymbol( buf, ALSTRX+44, ALSTRY, (char*)alarmstr, 9, 12 );
WindowDraw( wp, buf, 1 );
alarmtime=TIMEBCD( TIMECNV( alarmstr ) );
return TRUE;
}else if( timerflag == FALSE && in( TMSTRX+44, TMSTRY, TMSTRX+44+48, TMSTRY+12 ) ){
timechange( TMSTRX+44, TMSTRY, timerstr, info );
DrawSetSymbol( buf, TMSTRX+44, TMSTRY, (char*)timerstr, 9, 12 );
WindowDraw( wp, buf, 1 );
return TRUE;
}
if( info->LeftON ){
WindowMoveOperation( wp, info );
return TRUE;
}
break;
case EventUser:
switch( info->ComData ){
unsigned char *p= info->ComBuffer;
case UserPaste:
if( mode != mBEEP ){
while( *p ){
info->option= EventKey;
info->KeyCode= *p++;
WindowSendEvent( wp, info );
}
}
break;
case UserStrings:
p= *(unsigned char**)p;
case UserString:
if( mode != mBEEP ){
strcpy( mode ? exeline : pcmfile, p );
if( mode == mPCM )
pcmload();
WindowDraw( wp, buf, stline( buf ) );
}
break;
case 258: /* alarm time */
strcpy( alarmstr, info->ComBuffer );
alarmflag= TRUE;
WindowRedraw( wp );
break;
case 259: /* mode set */
mode= atoi2( info->ComBuffer );
WindowRedraw( wp );
break;
}
return TRUE;
case EventKey:
if( mode!=mBEEP ){
if( info->KeyCode == '\r' ){
if( mode == mPCM ){
strcpy( pcmfile, pcminput );
pcmload();
}else{
strcpy( exeline, exeinput );
}
WindowDraw( wp, buf, stline( buf ) );
}else{
WindowDraw( wp, buf, InputKey( buf, mode==mPCM? &pcmin : &exein , info->KeyCode, info->ShiftStat ) );
}
}
return TRUE;
}
return FALSE;
}
markset( buf, flag )
DrawBuf *buf;
int flag;
{
int i= 0;
if( flag ){
DrawSetSymbol( buf++, ALMX, ALMY, " ", 9, 16 );
DrawSetPut( buf++, MDX, MDY, &ModePattern );
i= 2;
}
if( alarmflag ){
DrawSetPut( buf++, ALMX, ALMY, &Alarm_markPattern );
i++;
}
if( timerflag ){
DrawSetPut( buf++, TMMX, TMMY, &Timer_markPattern );
i++;
}
if( signalflag ){
DrawSetPut( buf++, SGMX, SGMY, &Sig_markPattern );
i++;
}
return i;
}
timechange( x, y, str, info )
int x,
y;
unsigned char *str;
EventInfo *info;
{
static unsigned char Max[]= { '2', '9', 0, '5', '9', 0, '5', '9' };
int xp= (info->x - x)/6;
if( xp >= 0 && xp <= 7 && Max[xp] ){
if( info->LeftON ){
if( ++str[xp] > Max[xp] )
str[xp]= '0';
}else if( info->RightON ){
if( --str[xp] < '0' )
str[xp]= Max[xp];
}
}
if( str[0]=='2' && str[1] > '3' ){
if( xp == 0 )
str[0]= info->LeftON ? '0' : '1';
else
str[1]= info->LeftON ? '0' : '3';
}
}
stline( buf )
DrawBuf *buf;
{
DrawBuf *bp= buf;
DrawSetLine( bp++, STLINXX-1, STLINYY, STLINXX+80*6+3, STLINYY+32, 1, OptionFill );
if( mode != mBEEP ){
unsigned char *p=(mode == mPCM ? pcmname : exeline);
InputSetCursorVisible( 0, (mode == mPCM ? &pcmin : &exein ), FALSE );
if( *p == '\0' )
p= (unsigned char*)"<未設定>";
DrawSetLine( bp++, STLINXX-1, STLINYY+13, STLINXX+80*6+1/*WINSIZE2X-3*/, STLINYY+13, 0,OptionLine);
DrawSetSymbol( bp++, STLINXX, STLINYY, (char*)p, 9, 12 );
bp+= InputSetDraw( bp, mode == mPCM ? &pcmin : &exein );
bp+= InputSetCursorVisible( bp, (mode == mPCM ? &pcmin : &exein ), TRUE );
}
return bp-buf;
}
pcmload()
{
int fn;
if( !strchr( pcmfile, '.' ) )
strcat( pcmfile, ".pcm" );
if( (fn=OPEN( pcmfile, 0 ))>=0 ){
stcgfn( pcmname, pcmfile );
if( pcmdata ){
MFREE( pcmdata );
pcmdata = 0;
}
pcmsize=SEEK( fn, 0, 2 );
SEEK( fn, 0, 0 );
if( (int)(pcmdata=(unsigned char*)MALLOC( pcmsize ) ) >= 0 ){
READ( fn, pcmdata, pcmsize );
#ifdef DEBUG
puts("read");
#endif
}else{
pcmdata= 0;
*pcmname= '\0';
}
#ifdef DEBUG
printf("%d-%d\n", pcmdata, pcmsize );
#endif
CLOSE( fn );
}
}
progexec()
{
unsigned char *ptr= exeline,
*p,
buf[256];
int runflag= FALSE,
exemode= 0x3000000;
back:
for( p= buf ; *ptr && *ptr != ' ' ; *p++= *ptr++ );
*p= '\0';
if( *ptr )
ptr++;
if( !strcmpi( buf, "run" ) ){
runflag= TRUE;
goto back;
}
if( p= (unsigned char*)strchr( buf, '.' ) ){
if( strcmpi( p, ".win" ) )
exemode= 0;
}else
strcat( buf, ".win" );
if( runflag )
WindowScreenQuit();
WindowLoadExec( (char*)(exemode+buf), (char*)ptr, 0, 0 );
if( runflag )
WindowScreenInit();
}